﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace BasicWave
{
    /// <summary>
    /// questa è una classe astratta che implementa il volume e una funzione
    /// che permette di settare il volume prima che i dati vengano ritornati 
    /// al master channel
    /// 
    /// 
    /// </summary>
    public abstract class CBaseAudioChannel
    {


        #region "Proprietà";

        //memorizza il valore del volume...
        //TODO: da decidere il range per il volume
        private int _volume = 100;

        //non ho ben capito che cazzo è
        private int _sample = 256;


        /// <summary>
        /// proprietà per il volume
        /// </summary>
        public int Volume
        {
            get { return _volume; }
            set { _volume = value; }
        }


        #endregion



        #region "Funzioni"



        /// <summary>
        /// questa funzione viene chiamata ogni volta che il master richiede un fillchunk
        /// Il fillchunk permette al canale di inserire nel buffer referenziato dati
        /// provenienti dal proprio buffer.
        /// Prima di restituire il buffer..viene applicato il volume...
        /// <remarks>Funziona!</remarks>
        /// </summary>
        protected void VolumerizeByte(ref byte[] buffer, int size)
        {
            short[] temp = new short[size / 2];


            //converto in short
            Buffer.BlockCopy(buffer, 0, temp, 0, size);


            //applico volume
            for (int i = 0; i < (size / 2); i++)
                temp[i] = (short)((temp[i] * _volume) / _sample);


            //riconverto in byte
            Buffer.BlockCopy(temp, 0, buffer, 0, size);
        }



        #endregion
    }
}
